
這次的內容是製作一個網頁計時器,並且顯示結束時的時間
作品實做
const button = document.querySelectorAll(".timer__controls >button");
const custom = document.querySelector("#custom");
const endTime = document.querySelector(".display__end-time");
const timeLeft = document.querySelector(".display__time-left");
let countdown; // 用來存儲計時器的變量
//將取得的秒數轉為數字型別
function startTimer(e) {
  let seconds = parseInt(this.dataset.time); //將取得的秒數轉為數字型別
  timer(seconds); //啟動計時器
}
// 為每個計時按鈕綁定點擊事件監聽器
button.forEach((item) => {
  item.addEventListener("click", startTimer);
});
//處理表單自定義時間的提交事件
custom.addEventListener("submit", function (e) {
  e.preventDefault(); //防止提交後頁面重新加載
  let mins = parseInt(this.minutes.value); //輸入的分鐘數,並轉換為數字型別
  if (mins) {
    timer(mins * 60); //將分鐘數轉換為秒數,並啟動計時器
    this.reset(); //重置表單
  } 
});
//計時器函式
function timer(sec) {
  clearInterval(countdown); //清除任何已經在運行的計時器,防止重複
  let timeNow = Date.now(); //取得現在時間,單位為毫秒
  let end = timeNow + sec * 1000; //計算結束的總毫秒
  
  //執行顯示結束時間函式
  lastTime(end);
  //執行倒數計時函式
  setCountdown(end);
}
function setCountdown(end) {
  countdown = setInterval(() => {
    const secLeft = Math.floor((end - Date.now()) / 1000); //計算剩餘的秒數
    if (secLeft >= 0) {
      //計算秒及分鐘數
      let displaySec = secLeft % 60;
      let displayMin = Math.floor(secLeft / 60);
      timeLeft.innerText = `${displayMin}:${displaySec}`; //將倒數顯示在頁面上
    } else {
      clearInterval(countdown); //// 當計時器結束時,清除倒數計時器
    }
  }, 16); // 每16毫秒(接近螢幕刷新率)運行一次來更新剩餘時間
}
function lastTime(end) {
  let endDate = new Date(end); //將時間戳轉換成日期物件
  let dateHour = endDate.getHours(); //取得小時數
  let dateMin = endDate.getMinutes(); //取得分鐘數
  dateMin = dateMin < 10 ? "0" + dateMin : dateMin; //如果分鐘數小於10,前綴增加"0"
  endTime.textContent = `Back at ${dateHour}:${dateMin}`; //將時間顯示在頁面上
}